package taladro.proyecto;

import java.awt.Dimension;
import java.io.PrintStream;
import java.util.Vector;
import javax.swing.JOptionPane;

import org.eclipse.swt.graphics.Point;
import org.eclipse.ui.console.ConsolePlugin;
import org.eclipse.ui.console.IConsole;

import controles.interfaz.Consola;

import taladro.AppTaladro;
import taladro.control.AdminInstrucciones;
import taladro.instrucciones.InstCambiaHerr;
import taladro.instrucciones.Instruccion;
import taladro.instrucciones.evento.InstruccionListener;
import taladro.maquina.*;
import taladro.vista.aplicacion.ContApp;

// Referenced classes of package taladro.proyecto:
//            ProyectoListener, TraductorArchivo

public class Proyecto
    implements InstruccionListener
{

    protected String archivo;
    protected AdminInstrucciones instrucciones;
    private Maquina maquina;
    public Vector listeners;
    public Vector herramientas;
    protected TraductorArchivo traductor;
    protected Dimension dimension;
    protected Herramienta herramientaAct;
    protected Point dimensionn;//ash

    public Proyecto()
    {
        instrucciones = new AdminInstrucciones();
        herramientas = new Vector();
        instrucciones.addInstruccionListener(this);
        dimension = new Dimension();
        listeners = new Vector();
    }

    public Proyecto(String archivo)
    {
        instrucciones = new AdminInstrucciones();
        instrucciones.addInstruccionListener(this);
        this.archivo = archivo;
        listeners = new Vector();
    }

    public void iniciar()
    {
        instrucciones.ejecutarInstruccion();
    }

    public void parar()
        throws SecurityException
    {
        instrucciones.cancelarInstruccion();
    }

    public AdminInstrucciones getAdminInstrucciones()
    {
        return instrucciones;
    }

    public void instEjecutada()
    {
    	IConsole consolas[]=ConsolePlugin.getDefault().getConsoleManager().getConsoles();
        ((Consola)consolas[0]).imprime("Listo para ejecutar siguiente instrucci\363n");
        System.out.println("Listo para ejecutar siguiente instrucci\363n");
        Instruccion inst = instrucciones.getInstruccionActual();
        if(inst == null)
        {
            JOptionPane msg = new JOptionPane();
            JOptionPane _tmp = msg;
            JOptionPane.showMessageDialog(AppTaladro.getApp().contApp.frameApp, "Trabajo terminado", "Trabjajo terminado", 1);
            return;
        } else
        {
            iniciar();
            return;
        }
    }

    public void instCancelada()
    {
    }

    public void cargaArchivo(String nomArchivo, TraductorArchivo traductor)
    {
        archivo = nomArchivo;
        clear();
        //System.out.println("ya");
        traductor.traduceProyecto(this);
        traductor.getDimensiones(dimension);
    }

    public void ejecutandoInst(Instruccion instruccion)
    {
        ProyectoListener instListener = null;
        InstCambiaHerr instCambio = null;
        for(int i = 0; i < listeners.size(); i++)
        {
            instListener = (ProyectoListener)listeners.get(i);
            instListener.cambioInstruccion(instrucciones.getIndexInstActual());
            if(instruccion instanceof InstCambiaHerr)
            {
                instCambio = (InstCambiaHerr)instruccion;
                instListener.cambioHerramienta(instCambio.getHerramienta());
                herramientaAct = instCambio.getHerramienta();
                getMaquina().cambiarHerramienta(herramientaAct);
            }
        }

    }

    public void setMaquina(Maquina maquina)
    {
        this.maquina = maquina;
        instrucciones.setMaquina(maquina);
        Herramienta herramienta = new Herramienta("Default");
        herramienta.setLargo(30D);
        herramientas.add(0, herramienta);
        maquina.getColumna().setHerramienta(herramienta);
    }

    public Vector getHerramientas()
    {
        return herramientas;
    }

    public String getNombArchivo()
    {
        return archivo;
    }

    public void addListener(ProyectoListener listener)
    {
        listeners.addElement(listener);
    }

    public void removeListener(ProyectoListener listener)
    {
        listeners.removeElement(listener);
    }

    public void getDimProyecto(Dimension dimension)
    {
        dimension.setSize(this.dimension.getSize());
    }

    public Herramienta getHerramientaAct()
    {
        return herramientaAct;
    }

    public void reiniciar()
    {
        herramientaAct = (Herramienta)herramientas.elementAt(0);
        instrucciones.setInstruccionActual(0);
    }

    public void clear()
    {
        instrucciones.clearInst();
        Herramienta herramienta = (Herramienta)herramientas.get(0);
        herramientas.clear();
        herramientas.addElement(herramienta);
    }

    public Maquina getMaquina() {
        return maquina;
    }
    public void setDimProyecto(Point punto)
    {
       dimensionn.x=punto.x;
       dimensionn.y=punto.y;
    }

}
